/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja7;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.Random;
/**
 *
 * @author Jrobles
 */
public class Hoja7 {

     public static void main(String args[]) {
         
         int opcion; 
         String cadena;
         node item;
         Scanner teclado = new Scanner (System.in);
         Heap lista;
         
         do
        {
            menu();
            //-----------------------------------------------------------------------------
            //programacion defensiva
            opcion=(int)obtenerNum("\n    Ingrese la opcion que desee llevar a cabo: \n",false);
            if (opcion<0)
                opcion=0;
            //-----------------------------------------------------------------------------
            
            switch(opcion)
            {
                case 1:
                    System.out.println("    Instrucciones: A continuacion se le pedira ingresar"
                            + " una cadena. El objetivo es que por medio de la \n    implementacion"
                            + " de un arbol de Huffman se le muestre la frecuencia de cada caracter"
                            + " y el codigo binario \n    generado para cada uno.\n \n"
                            + "    Presione ENTER para continuar. ");
                    teclado.nextLine();
                         
        
                    break;
                             
                case 2:
                     System.out.println("   Ingrese la cadena: ");
                     cadena = teclado.nextLine();
                     lista = new Heap(cadena.length());
                     
                     System.out.println("\n  A continuacion, se muestra el resultado \n");
                     
                    for(int i =0; i < cadena.length(); i++) {            
                        node arbol = new node(cadena.charAt(i));
                        item = lista.remove(arbol);
                        if (item == null) {
                            lista.insert(arbol);
                        } 
                        else {
                            item.incFrequency();
                            lista.insert(item);

                        }
                    }
                    //Unir todos los nodos a un solo nodo (arbol)
                    while(lista.getAmount() > 1) {
                        node nodoTemp = new node();
                        int f1, f2;
                        f1= lista.seeFirst().getFrequency() ;
                        nodoTemp.setLeft(lista.remove());
                        f2 = lista.seeFirst().getFrequency(); 
                        nodoTemp.setRight(lista.remove());
                        nodoTemp.setFrequency(f1+f2);           
                        lista.insert(nodoTemp);
                    }
                        lista.seeFirst().run();
                        
                        System.out.println("\n    Presione Enter para continuar");
                        teclado.nextLine();

                    break;
                    
                case 3://fin del programa
                    System.out.println("      FIN DEL PROGRAMA:");
                    break;
                default:
                    System.out.println("ERROR: Ingrese un numero del 1 al 3.");
                    System.out.println("\n      Presione ENTER para continuar");
                    teclado.nextLine();
               
            }
            
        }while (opcion!=3);
         
         
      
    }
    
      //menu utilizado para indicar distintas opciones al usuario
     public static void menu()
    {
        System.out.println();
        System.out.println("\n------------HOJA 7: IMPLEMENTACION DE ARBOLES BINARIOS-----------\n");
        System.out.println("             -------    MENU INTERACTIVO    -------\n");
        System.out.println("          | 1. Instrucciones   |");
        System.out.println("          | 2. Ingresar la cadena              |");
        System.out.println("          | 3. Salir del programa                   |");
    }
     
    //---------------------------------------------------------------------------------
     
    //metodo utilizado como programacion defensiva al momento de pedir datos al usuario
    public static double obtenerNum(String mensaje, boolean mostrar)
    {
        Scanner teclado=new Scanner (System.in);
        double num=-1;
        
        System.out.print(mensaje);
        try
        {
            num=teclado.nextDouble();
        }
        catch(InputMismatchException exception)
        {
            if (mostrar)
                System.out.println("\nError: este dato es invalido.\n");
        }
        finally
        {
            teclado.nextLine(); //atrapar el enter
        }
        return num;
    }
}
